package io_0929;

import java.io.*;
import java.util.Scanner;

/**
 * 扫描指定目录，并找到名称或者内容中包含指定字符的所有普通文件（不包含目录）
 * 注意：我们现在的方案性能较差，所以尽量不要在太复杂的目录下或者大文件下实验
 * (这是第一个小程序的进阶)
 */
public class MiniProgram3 {
    public static void main(String[] args) throws IOException {
        // 1. 输入路径 和 查找的关键词
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径: ");
        File rootDir = new File(scanner.next());

        System.out.println("请输入要查询的关键字: ");
        String toFind = scanner.next();

        // 2. 递归扫描目录
        scanDir(rootDir,toFind);
    }

    private static void scanDir(File rootDir, String toFind) throws IOException {
        File[] files = rootDir.listFiles();
        if(files == null) return;

        for(File f : files) {
            if(f.isDirectory()) {
                // 是目录
                scanDir(f,toFind);

            } else {
                // 是普通文件
                checkFile(f,toFind);
            }
        }
    }


    private static void checkFile(File f, String toFind) throws IOException {
        // 1.检查文件名
        if(f.getName().contains(toFind)) {
            System.out.println(f.getCanonicalPath() + " 文件名中包含 " + toFind);
        }
        // 2.检查文件内容
        // 读取文件内容
        try(InputStream inputStream = new FileInputStream(f)) {
            StringBuilder stringBuilder = new StringBuilder();
            Scanner scanner = new Scanner(inputStream);
            // 需要按行读取 拼接到StringBuilder
            while(scanner.hasNextLine()) {
                stringBuilder.append(scanner.nextLine()).append("\n");
            }
            if(stringBuilder.indexOf(toFind) > -1) {
                System.out.println(f.getCanonicalPath() + " 文件内容包含 " + toFind);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
